1   /*
2    * Copyright (C) 2008 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.google.common.collect;
18  
19  import com.google.common.annotations.GwtCompatible;
20  import com.google.common.base.Function;
21  import com.google.common.base.Predicate;
22  import com.google.common.collect.Maps.EntryTransformer;
23  
24  import java.lang.reflect.Array;
25  import java.util.Collections;
26  import java.util.Map;
27  import java.util.NavigableMap;
28  import java.util.NavigableSet;
29  import java.util.Set;
30  import java.util.SortedMap;
31  import java.util.SortedSet;
32  
33  /**
34   * Methods factored out so that they can be emulated differently in GWT.
35   *
36   * @author Hayward Chan
37   */
38  @GwtCompatible(emulated = true)
39  final class Platform {
40    /**
41     * Returns a new array of the given length with the same type as a reference
42     * array.
43     *
44     * @param reference any array of the desired type
45     * @param length the length of the new array
46     */
47    static <T> T[] newArray(T[] reference, int length) {
48      Class<?> type = reference.getClass().getComponentType();
49  
50      // the cast is safe because
51      // result.getClass() == reference.getClass().getComponentType()
52      @SuppressWarnings("unchecked")
53      T[] result = (T[]) Array.newInstance(type, length);
54      return result;
55    }
56    
57    static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
58      return Collections.newSetFromMap(map);
59    }
60  
61    /**
62     * Configures the given map maker to use weak keys, if possible; does nothing
63     * otherwise (i.e., in GWT). This is sometimes acceptable, when only
64     * server-side code could generate enough volume that reclamation becomes
65     * important.
66     */
67    static MapMaker tryWeakKeys(MapMaker mapMaker) {
68      return mapMaker.weakKeys();
69    }
70  
71    static <K, V1, V2> SortedMap<K, V2> mapsTransformEntriesSortedMap(
72        SortedMap<K, V1> fromMap,
73        EntryTransformer<? super K, ? super V1, V2> transformer) {
74      return (fromMap instanceof NavigableMap)
75          ? Maps.transformEntries((NavigableMap<K, V1>) fromMap, transformer)
76          : Maps.transformEntriesIgnoreNavigable(fromMap, transformer);
77    }
78  
79    static <K, V> SortedMap<K, V> mapsAsMapSortedSet(SortedSet<K> set,
80        Function<? super K, V> function) {
81      return (set instanceof NavigableSet)
82          ? Maps.asMap((NavigableSet<K>) set, function)
83          : Maps.asMapSortedIgnoreNavigable(set, function);
84    }
85  
86    static <E> SortedSet<E> setsFilterSortedSet(SortedSet<E> set,
87        Predicate<? super E> predicate) {
88      return (set instanceof NavigableSet)
89          ? Sets.filter((NavigableSet<E>) set, predicate)
90          : Sets.filterSortedIgnoreNavigable(set, predicate);
91    }
92    
93    static <K, V> SortedMap<K, V> mapsFilterSortedMap(SortedMap<K, V> map,
94        Predicate<? super Map.Entry<K, V>> predicate) {
95      return (map instanceof NavigableMap)
96          ? Maps.filterEntries((NavigableMap<K, V>) map, predicate)
97          : Maps.filterSortedIgnoreNavigable(map, predicate);
98    }
99  
100   private Platform() {}
101 }